(function() {
	var ua = navigator.userAgent;
	isWebKit = /WebKit/.test(ua);
	isOldWebKit = isWebKit && !window.getSelection().getRangeAt;
	isIE6 = jQuery.browser.msie && /MSIE [56]/.test(ua);
	isGecko = !isWebKit && /Gecko/.test(ua);
	isMac = ua.indexOf('Mac') != -1;

	jQuery.browser.webkit = isWebKit;
	jQuery.browser.oldwebkit = isOldWebKit;
	jQuery.browser.ie6 = isIE6;
	jQuery.browser.gecko = isGecko;
	jQuery.browser.mac = isMac;

	jQuery.Dom = {
        getViewPort: function() {
			var d = document, b = d.body;
            var mode = d.compatMode;

            var width = self.innerWidth;  // Safari
            var height = self.innerHeight; // Safari, Opera
			if (mode || jQuery.browser.msie) { // IE, Gecko, Opera
                width = (mode == 'CSS1Compat') ? d.documentElement.clientWidth : b.clientWidth;
				if (!jQuery.browser.opera ) height = (mode == 'CSS1Compat') ? d.documentElement.clientHeight : b.clientHeight;
            }

			return {
				x: Math.max(d.documentElement.scrollLeft, b.scrollLeft),
				y: Math.max(d.documentElement.scrollTop, b.scrollTop),
				w: width,
				h: height
			};
        },

		getContextXY : function (src_id, dst_id, place, pageXY){
			var opt = {}, dst_pos, src_pos, obj_src, obj_dst, vp;

			obj_src = $(src_id);
			if (obj_src.length == 0) return opt;
			src_pos = { x:obj_src.offset().left, y:obj_src.offset().top, w:obj_src.width(), h:obj_src.height() };

			;
			if (dst_id && (obj_dst = $(dst_id)).length > 0) dst_pos = { x:obj_dst.offset().left, y:obj_dst.offset().top, w:obj_dst.width(), h:obj_dst.innerHeight() };
			else if (pageXY.x && pageXY.y) dst_pos = { x:pageXY.x, y:pageXY.y, w:0, h:0 };
			else return opt;

			vp = this.getViewPort();

			if (!place) place = "bottom";
			if (place == "bottom"){
				opt.x = dst_pos.x;
				if (src_pos.h+dst_pos.y+dst_pos.h > vp.y+vp.h && dst_pos.y-vp.y > src_pos.h) opt.y = dst_pos.y - src_pos.h;
				else opt.y = dst_pos.y + dst_pos.h;
			}
			else if (place == "right"){
				if (dst_pos.x+dst_pos.w+src_pos.w > vp.x+vp.w && dst_pos.x-vp.x>src_pos.w)opt.x = dst_pos.x-src_pos.w;
				else opt.x = dst_pos.x+dst_pos.w;
				opt.y = dst_pos.y;
			}
			else if (place == "left"){
				if (dst_pos.x-src_pos.w < vp.x && dst_pos.x-vp.x<src_pos.w)opt.x = dst_pos.x+dst_pos.w;
				else opt.x = dst_pos.x-src_pos.w;
				opt.y = dst_pos.y;
			}
			else if (place == "top"){
				opt.x = dst_pos.x;
				if (dst_pos.y-vp.y < src_pos.h && vp.h+vp.y-dst_pos.y-dst_pos.h > src_pos.h) opt.y = dst_pos.y + dst_pos.h;
				else opt.y = dst_pos.y-src_pos.h;
			}

			if (place == "bottom" || place == "top"){
				if (dst_pos.x+src_pos.w > vp.x+vp.w && dst_pos.x+dst_pos.w-vp.x>src_pos.w)opt.x = dst_pos.x+dst_pos.w-src_pos.w;
			}
			if (place == "left" || place == "right"){
				if (src_pos.h+dst_pos.y > vp.y+vp.h && dst_pos.y+dst_pos.h-vp.y > src_pos.h) opt.y = dst_pos.y+dst_pos.h - src_pos.h;
			}
			return opt;
		},

		getIframeElement : function(id) {
			return jQuery(id);
		},

		getIframeWindow : function(name) {
			return window.frames[name];
		},

		getIframeDocument : function(name) {
			return window.frames[name].document;
		}

	}

	jQuery.global = {
		counter_id : 0,
		generateId : function (el, prefix) {
			if (el && el.id) return el.id;
			var id = (prefix || 'jqauto_') + this.counter_id++;
			if (el) el.id = id;
			return id;
		},

		htmlEncode : function (s) {
			return s ? ('' + s).replace(/[<>&\"]/g, function (c, b) {
				switch (c) {
					case '&': return '&amp;';
					case '"': return '&quot;';
					case '<': return '&lt;';
					case '>': return '&gt;';
				}
				return c;
			}) : s;
		}
	};

})();